{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# A Gradient Boosted Tree Model for the Adult Dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This example introduces the reader to the fitting and evaluation of gradient boosted tree models. We consider a binary classification task into two income brackets  (less than or greater than  \\$50, 000), given attributes such as capital gains and losses, marital status, age, occupation, etc..\n",
    "\n",
    "This example will use the [xgboost](https://github.com/dmlc/xgboost) library, which can be installed with:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install xgboost"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import xgboost as xgb\n",
    "\n",
    "from alibi.datasets import fetch_adult\n",
    "from copy import deepcopy\n",
    "from functools import partial\n",
    "from itertools import chain, product\n",
    "from scipy.special import expit\n",
    "invlogit=expit\n",
    "from sklearn.metrics import accuracy_score, confusion_matrix\n",
    "from tqdm import tqdm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data preparation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load and split"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `fetch_adult` function returns a `Bunch` object containing the features, targets, feature names and a mapping of categorical variables to numbers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "adult = fetch_adult()\n",
    "adult.keys()\n",
    "\n",
    "data = adult.data\n",
    "target = adult.target\n",
    "target_names = adult.target_names\n",
    "feature_names = adult.feature_names\n",
    "category_map = adult.category_map"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that for your own datasets you can use the utility function `gen_category_map` imported from `alibi.utils.data`  to create the category map."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(0)\n",
    "data_perm = np.random.permutation(np.c_[data, target])\n",
    "data = data_perm[:,:-1]\n",
    "target = data_perm[:,-1]\n",
    "\n",
    "idx = 30000\n",
    "X_train,y_train = data[:idx,:], target[:idx]\n",
    "X_test, y_test = data[idx+1:,:], target[idx+1:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create feature transformation pipeline and preprocess data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Unlike in a previous [example](kernel_shap_adult_lr.ipynb), the categorical variables are not encoded. For linear models such as logistic regression, using an encoding of the variable that assigns a unique integer to a category will affect the coefficient estimates as the model will learn patterns based on the ordering of the input, which is incorrect. In contrast, by encoding the into a sequence of binary variables, the model can learn which encoded dimensions are relevant for predicting a given target but cannot represent non-linear relations between the categories and targets. \n",
    "\n",
    "On the other hand, decision trees can naturally handle both data types simultaneously; a categorical feature can be used for splitting a node multiple times. So, hypothetically speaking, if the categorical variable `var` has `4` levels, encoded `0-3` and level `2` correlates well with a particular outcome, then a decision path could contain the splits `var < 3` and `var > 1` if this pattern generalises in the data and thus splitting according to these criteria reduce the splits' impurity. \n",
    "\n",
    "In general, we note that for a categorical variable with $q$ levels there are $2^{q-1}-1$ possible partitions into two groups, and for large $q$ finding an optimal split is intractable. However, for binary classification problems an optimal split can be found efficiently (see references in [[1]](#References)). As $q$ increases, the number of potential splits to choose from increases, so it is more likely that a split that fits the data is found. For large $q$ this can lead to overfitting, so variables with large number of categories can potentially harm model performance.\n",
    "\n",
    "The interested reader is referred to consult these blog posts ([first](https://roamanalytics.com/2016/10/28/are-categorical-variables-getting-lost-in-your-random-forests/), [second](https://towardsdatascience.com/one-hot-encoding-is-making-your-tree-based-ensembles-worse-heres-why-d64b282b5769)), which demonstrate of the pitfalls of encoding categorical data as one-hot when using tree-based models. `sklearn` expects that the categorical data is encoded, and this approach should be followed when working with this library.\n",
    "\n",
    "<a id='source_4'></a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model optimisation\n",
    "<a id='optimisation'></a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`xgboost` wraps arrays using  `DMatrix` objects, optimised for both memory efficiency and training speed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def wrap(arr):\n",
    "    return np.ascontiguousarray(arr)\n",
    "\n",
    "dtrain = xgb.DMatrix(\n",
    "    wrap(X_train), \n",
    "    label=wrap(y_train), \n",
    "    feature_names=feature_names, \n",
    ")\n",
    "\n",
    "dtest = xgb.DMatrix(wrap(X_test), label=wrap(y_test), feature_names=feature_names)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`xgboost` defines three classes of parameters that need to be configured in order to train and/or optimise a model:\n",
    "\n",
    "* general parameters: high level settings such as the type of boosting model\n",
    "\n",
    "* learning parameters: these are parameters that control the boosting process (model hyperparameters)\n",
    "\n",
    "* learning task parameters: define the optimisation objective and the metric on which the validation performance is measured"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "learning_params = {}\n",
    "booster_params = {}\n",
    "general_params = {}\n",
    "params = {}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is a binary classification problem, optimised with binary cross-entropy as an objective, defined as:\n",
    "<a id='f_1'></a>\n",
    "\n",
    "$$\n",
    "J (y_i, \\hat{y}_i) = -\\frac{1}{N} \\sum_{i=1}^N [y_i \\log(1 + e^{- \\hat{y}_i}) + (1 - y_i) \\log (1 + e^{\\hat{y}_i})]\n",
    "$$\n",
    "\n",
    "where $y_i$ is the true label for the $i$th observation and $\\hat{y}_i$ is the decision score (logit) <sup>[(1)](#Footnotes) </sup> of the positive class (whose members' income exceeds \\$50, 000). Setting the objective to `binary:logitraw` means the call to the `predict` method will output $\\hat{y}_i$. \n",
    "\n",
    "<a id='f_1'></a>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learning_params.update({\n",
    "    'objective':'binary:logitraw',\n",
    "    'seed': 42,\n",
    "    'eval_metric': ['auc', 'logloss'] # metrics computed for specified dataset\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The [AUC](https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve) will be used as a target for early stopping during hyperparameter optimisation . Using this metric as opposed to, e.g., accuracy helps deal with the imbalanced data since this metric balances the true positive rate and the false positive rate. However, it should be noted that AUC is an _aggregate_ performance measure since it is derived by matching predicted labels with ground truths across models with different output thresholds. In practice, however, only one such model is selected. Thus, a higher AUC just reflects that on average, the ensemble performs better. However, whether the classifier selected according to this metric is optimal depends on the threshold chosen for converting the predicted probabilities to class labels.\n",
    "\n",
    "Additionally, the weights of the positive are scaled to reflect the class imbalance. A common setting is to scale the positive class by the ratio of the negative to positive examples (approximately 3 for this dataset). Since this is a heuristic approach, this parameter will be cross-validated.\n",
    "\n",
    "\n",
    "The first parameters optimised are:\n",
    "\n",
    "* `max_depth`: the maximum depth of any tree added to the ensemble. Deeper trees are more accurate (on training data) since they represent more specific rules\n",
    "\n",
    "* `min_child_weight`: child nodes are required to have a total weight above this threshold for a split to occur. For a node $L$, this weight is computed according to \n",
    "\n",
    "$$\n",
    "H_L = \\sum_{i}w_i  \\frac{\\partial^2 J (y_i, \\hat{y}_{i,{t-1}})}{\\partial {\\hat{y}_{i,t-1}}^2}\n",
    "$$\n",
    "\n",
    "where the summation of Hessians is over all examples $i$ split at the node, and the subscript $t-1$ indicates that the derivative is with respect to the output evaluated at the previous round in the boosting [process](https://xgboost.readthedocs.io/en/stable/tutorials/model.html). In this example, the weight $w_i$ depends on the class and is controlled through the `scale_pos_weight` argument. The second derivative above is given by\n",
    "\n",
    "$$\n",
    "\\frac{2 e^{\\hat{y}_i}}{{(1 + e^{\\hat{y}_i})}^2},\n",
    "$$\n",
    "\n",
    "whose variation is depicted in Figure 1."
   ]
  },
  {
   "attachments": {
    "hess.png": {
     "image/png": "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PljxR7/ez3Kb+3iM50SNiiohhBBCCCGECIGKKiGEEEIIIYQIgYoqIYQQQgghhAiBiiohhBBCCCGECIGKKiGEEEIIIYQIgYoqIYQQQgghhAiBiiohhBBCCCGECIGKKiGEEEIIIYQIgYoqIYQQQgghhAiBiiohhBBCCCGECIGKKiGEEEIIIYQIgYoqIYQQQgghhAiBiiohhBBCCCGECIGKKiGEEEIIIYQIgYoqIYQQQgghhAiBiiohhBBCCCGECIGKKiGEEKKZ+fXXX+3nn3+2Q4cO2YYNG6y6utree+89++STT+zbb7+NPeso33zzjW3fvt3WrVtnNTU19sEHH9gXX3xhv/zyi3svIYQQmUVFlRBCCNHMUFAdOXLEFUhPPPGEde3a1fr06WNTp051hVUiFFTjxo2znj172h133GH9+/d3BdYPP/zgCishhBCZRUWVEEII0cz4oqqiosIefPBB++9//2sXX3yxde/e3VatWmWHDx+2H3/80RVNBw8etGXLltmdd95pbdq0scsuu8wee+wxq6urU1ElhBBZgooqIYQQopnx4387duywOXPmuBWof//739a2bVsbPXq0GwWksKKgqqystMGDB1vr1q3t7LPPtr59+9rixYttz549Gv8TQogsQUWVEEIIkSG++uor27Rpk02cONEuueQSO+uss+yBBx6wKVOm2ObNm93eKYosRv4outq1a2fTp09344DssxJCCJEdqKgSQgghMsRPP/3kCqu1a9da79693WjfBRdcYAUFBbZw4UKbP3++de7c2c477zzr0KGD9evXz+3DoqDitUIIIbIDFVVCCCFEhtm5c6fNmDHDrVKxWvWf//zHjfkhrVq1cqtUjzzyiC1YsMCN/QkhhMguVFQJIYQQGebrr7+2rVu3urG/K6+80v7+97/bv/71LzvzzDPt1FNPtWuuucbtvUp15LoQQojMoqJKCCGEyDAcOPH999+7MUBO+fvHP/5h//d//2d/+MMfXGHVo0cPq62tdSN/OphCCCGyDxVVQgghRIahUKKw4oeA+Q2qiy66yP74xz/aSSedZDfccIONGjXKPvroIxVUQgiRpaioEkIIITIMx6sz1lddXe32UV144YX25z//2Y0BdurUyYYOHWobN250v12l36USQojsQ0WVEEIIkWEoqDisYvbs2da+fXs7+eST7W9/+5sbAzzttNOsa9eutnz5cvvyyy9dYSWEECK7UFElhBBCZAg/9rd3714rLi52R6afc8457nAKjlBHuM3K1ciRI23dunX2xRdfxF4thBAiW1BRJYQQQmQICipWnt5991039sfJf23atLFbbrnFJk2aZOPGjbPLL7/cHbN+6623usKKUwKFEEJkFyqqhBBCiAzB2N+OHTts1qxZdvXVV9vZZ59tXbp0sWHDhrk9VHV1dfboo4+6HwWm2OJkwGXLltnBgwfthx9+iL2LEEKITKOiSgghhMgQu3fvtnnz5lnv3r3dD/wy5jdixAi3ckXhxA/9Ll682K1iUXC1bt3aBg8ebFVVVe5xIYQQ2YGKKiGEEKKZ4femvvnmG3fa35NPPun2Tp1//vlWUFBgZWVlDQdS8Jzt27fb9OnTrV27dq7w4jljx461LVu26DRAIYTIElRUCSGEEM1MfLHEPipWoe655x6bOHGi+z0qXyzFF19PPfWUXXXVVXbeeefZbbfd5sYAObRCpwEKIUTmUVElhBBCNDO+qJo7d67ddddd7sj0CRMmWG1trR06dCj2rKMwBrhgwQJ77rnn3J6rXr162apVq1RUCSFElqCiSgghhGhm/AoUe6oopFiJosiioEp2AMWRI0dcYcXhFeyn4mj1AwcOaPxPCCGyArP/DwshsAXcK+z9AAAAAElFTkSuQmCC"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![hess.png](attachment:hess.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Figure 1 shows that when the classifier assigns a high positive or a low negative score, the contribution of data point $i$ to the child weight is very small. Therefore, setting a very small value for `min_child_weight` parameter can result in overfitting since the splitting process will make splits in order to ensure the instances in a leaf are correctly classified at the expense of finding more parsimonious rules that generalise well.\n",
    "\n",
    "* `scale_pos_weight`: a scaling factor applied to the positive class to deal with class imbalance\n",
    "\n",
    "* `gamma`: is a parameter that controls the minimum gain that has to be attained in order for a split to be made\n",
    "\n",
    "To understand `gamma`, recall that the _gain_ of making a particular split is defined as function of the _structure scores_ of the left (L) and right (R) child nodes and the structure score of the parent as \n",
    "\n",
    "$$\n",
    "gain = \\frac{1}{2}\\left[\\frac{G_L^2}{H_L + \\lambda} + \\frac{G_R^2}{H_R + \\lambda} - \\frac{{(G_L+G_R)}^2}{H_L + H_R + \\lambda}  \\right] - \\gamma\n",
    "$$\n",
    "\n",
    "where $\\lambda$ is a regularisation hyperparameter shrinking the model output, $H_L$ is defined above and $G_L$ is given by\n",
    "\n",
    "$$\n",
    "G_L = \\sum_{i}w_i  \\frac{\\partial J (y_i, \\hat{y}_{i,{t-1}})}{\\partial {\\hat{y}_{i,t-1}}}\n",
    "$$\n",
    "\n",
    "and $i$ sums over the points that flow through the node $L$. Note that these structure scores represent minimisers of the objective (which is simply a quadratic in the leaf value). To make a split, the gain should exceed $\\gamma$.\n",
    "\n",
    "\n",
    "The _learning rate_ (`eta`) is fixed. This parameter is the fraction of the output score a member of the ensemble contributes to the decision score. Lower values yield larger ensembles."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "def tune_params(dtrain, base_params,  param_dict, maximise=True, prev_optimum=None, **kwargs):\n",
    "    \"\"\"\n",
    "        Given a training set `dtrain`, a dictionary of parameters to be optimised `param_dict` and \n",
    "        all the other learning and booster parameters (`base_param`), this function runs an \n",
    "        exhaustive grid search over the tuning parameters.\n",
    "        \n",
    "        NB: Specifying `prev_optimum` allows one to tune parameters in stages. maximise should indicate\n",
    "        if the evaluation metric should be maximised during CV.\n",
    "    \"\"\"\n",
    "\n",
    "    def _statistic(maximise, argument=False):\n",
    "        if maximise:\n",
    "            if argument:\n",
    "                return np.argmax\n",
    "            return np.max\n",
    "        if argument:\n",
    "            return np.argmin\n",
    "        return np.min\n",
    "    \n",
    "    \n",
    "    def _compare(optimum, val, maximise=True):\n",
    "        \n",
    "        eps=1e-4\n",
    "        \n",
    "        if maximise:\n",
    "            if val > optimum + eps:\n",
    "                return True\n",
    "            return False\n",
    "        if val < optimum - eps:\n",
    "            return True\n",
    "        return False\n",
    "    \n",
    "    statistic = partial(_statistic, maximise)\n",
    "    compare = partial(_compare, maximise=maximise)\n",
    "    metrics = kwargs.get(\"metrics\")\n",
    "    if isinstance(metrics, list):\n",
    "        opt_metric = metrics[-1]\n",
    "    else:\n",
    "        opt_metric = metrics\n",
    "\n",
    "    print(f\"CV with params: {list(param_dict.keys())}\")\n",
    "    print(f\"Tracked metrics: {metrics}\")\n",
    "    print(f\"Cross-validating on: {opt_metric}\")\n",
    "    \n",
    "    if prev_optimum:\n",
    "        optimum = prev_optimum\n",
    "    else:    \n",
    "        optimum = -float(\"Inf\") if maximise else float(\"Inf\")\n",
    "    \n",
    "    params = deepcopy(base_params)\n",
    "    pars, pars_val = list(param_dict.keys()), list(param_dict.values())\n",
    "    combinations = list(product(*pars_val))\n",
    "    best_combination = {}\n",
    "    \n",
    "    # run grid search\n",
    "    for combination in tqdm(combinations):\n",
    "        for p_name, p_val in zip(pars, combination):\n",
    "            params[p_name] = p_val\n",
    "        cv_results = xgb.cv(\n",
    "            params,\n",
    "            dtrain,\n",
    "            **kwargs,\n",
    "        )\n",
    "        mean = statistic()(cv_results[f'test-{opt_metric}-mean'])\n",
    "        boost_rounds = statistic(argument=True)(cv_results[f'test-{opt_metric}-mean'])    \n",
    "        improved = compare(optimum, mean)\n",
    "        if improved:\n",
    "            optimum = mean\n",
    "            for name, val in zip(pars, combination):\n",
    "                best_combination[name]=val\n",
    "            print(f\"{opt_metric} mean value: {mean} at {boost_rounds} rounds\")\n",
    "            msg = 'Best params:' + '\\n{}: {}'*len(pars)\n",
    "            print(msg.format(*list(chain(*best_combination.items()))))\n",
    "        \n",
    "    return optimum, best_combination, boost_rounds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "booster_params.update({'eta': 0.1})\n",
    "\n",
    "tuning_params={\n",
    "        'scale_pos_weight': [2, 3, 4, 5],\n",
    "        'min_child_weight': [0.1, 0.5, 1.0, 2.0, 5.0],\n",
    "        'max_depth': [3, 4, 5],\n",
    "        'gamma': [0.01, 0.05, 0.08, 0.1, 0.2]\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All parameters apart from the ones tuned are included in `params`. The cross-validation process is controlled through `cv_opts`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "params.update(general_params)\n",
    "params.update(learning_params)\n",
    "params.update(booster_params)\n",
    "\n",
    "cv_opts = {\n",
    "    'num_boost_round': 1000,\n",
    "    'nfold': 5, \n",
    "    'stratified': True,\n",
    "    'metrics': ['logloss', 'aucpr', 'auc'],  # can alternatively perform early stopping on log-loss or aucpr\n",
    "    'early_stopping_rounds': 20,\n",
    "    'seed': 42,\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Optimise `scale_pos_weight`, `min_child_weight`, `max_depth` and `gamma`. Note that this section is **long running** since it conducts an extensive grid search. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "optimum, best_params, boost_rounds = tune_params(dtrain, \n",
    "                                                 params, \n",
    "                                                 tuning_params, \n",
    "                                                 maximise=True, \n",
    "                                                 **cv_opts\n",
    "                                                )\n",
    "\n",
    "if best_params:\n",
    "    params.update(best_params)\n",
    "    params.update({'boost_rounds': boost_rounds})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "params"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Further optimisation is possible by adjusting the following parameters:\n",
    "\n",
    "* `subsample`: this is the ratio of the total training examples that will be used for training during each boosting round\n",
    "\n",
    "* `colsamplebytree`: this is the ratio of the features used to fit an ensemble member during a boosting round\n",
    "\n",
    "Training on uniformly chosen data subsamples with uniformly chosen subsets of features promotes noise robustness. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "tuning_params = {\n",
    "    'subsample': [0.6, 0.7, 0.8, 0.9, 1.0],\n",
    "    'colsamplebytree': [0.6, 0.7, 0.8, 0.9, 1.0]\n",
    "}\n",
    "\n",
    "optimum, best_params, boost_rounds = tune_params(dtrain, \n",
    "                                                 params, \n",
    "                                                 tuning_params, \n",
    "                                                 maximise=True, \n",
    "                                                 prev_optimum=optimum,\n",
    "                                                 **cv_opts\n",
    "                                                )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "None of the stated configuration resulted in an improvement of the AUC, which could be a consequence of the fact that:\n",
    "\n",
    "* the parameters selected in the previous round provide strong model regularisation; in particular, the maximum tree depth for any ensemble member is 3, which means only a subset of features are used anyway to perform the splits in any given tree. Further subsampling may thus not be effective since the subsampling is already implicit in the chosen tree structure\n",
    "\n",
    "* the AUC is insensitive to small model changes since it measures how the proportion of false positives changes as the number of false negatives changes across a range of models. The confidence of the models does not feature in this measure (since a highly confident classifier and one that predicts probabilities near the decision threshold will have identical AUC)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "if best_params:\n",
    "    params.update(best_params)\n",
    "    params.update({'boost_rounds': boost_rounds})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "params"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To prevent overfitting, a regulariser $\\Omega(f_t)$ with the form \n",
    "\n",
    "$$\n",
    "\\Omega(f_t) = \\gamma T + \\frac{\\lambda}{2} \\sum_{j=1}^T s_{j,t}^2\n",
    "$$\n",
    "\n",
    "is added to the objective function at every boosting round $t$. Above $T$ is the total number of leaves and $s_{j,t}$ is the score of the $j$th leaf at round $t$. For the binary logistic objective, a higher $\\lambda$ penalises confident predictions (shrinks the scores). \n",
    "\n",
    "By default $\\lambda = 1$. Since subsampling data and features did not improve the performance, we explore with relaxing regularisation in order to adjust the model regularisation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "tuning_params = {\n",
    "    'lambda': [0.01, 0.1, 0.5, 0.9, 0.95, 1, 2, 5, 10]\n",
    "}\n",
    "\n",
    "optimum, best_params, boost_rounds = tune_params(dtrain, \n",
    "                                                 params, \n",
    "                                                 tuning_params, \n",
    "                                                 maximise=True, \n",
    "                                                 prev_optimum=optimum,\n",
    "                                                 **cv_opts)\n",
    "\n",
    "if best_params:\n",
    "    params.update(best_params)\n",
    "    params.update({'boost_rounds': boost_rounds})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model training\n",
    "<a id='training'></a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The model will now be trained with the following parameters (skip the `param` update if you ran the optimisation section):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "learning_params = {\n",
    "    'objective':'binary:logitraw',\n",
    "    'seed': 42,\n",
    "    'eval_metric': ['auc', 'logloss'] # metrics computed for specified dataset\n",
    "}\n",
    "\n",
    "\n",
    "params = { \n",
    "    'scale_pos_weight': 2,\n",
    "    'min_child_weight': 0.1,\n",
    "    'max_depth': 3,\n",
    "    'gamma': 0.01, \n",
    "    'boost_rounds': 541,\n",
    "}\n",
    "\n",
    "params.update(learning_params)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "if 'boost_rounds' in params:\n",
    "    boost_rounds = params.pop('boost_rounds')\n",
    "\n",
    "model = xgb.train(\n",
    "    params,\n",
    "    dtrain,\n",
    "    num_boost_round=boost_rounds,\n",
    "    evals=[(dtrain, \"Train\"), (dtest, \"Test\")],\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save_model('assets/adult_xgb.mdl')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model assessment"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The confusion matrix is used to quantify the model performance below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_conf_matrix(y_test, y_pred, class_names):\n",
    "    \"\"\"\n",
    "    Plots confusion matrix. Taken from:\n",
    "    http://queirozf.com/entries/visualizing-machine-learning-models-examples-with-scikit-learn-and-matplotlib\n",
    "    \"\"\"\n",
    "    \n",
    "    matrix = confusion_matrix(y_test,y_pred)\n",
    "\n",
    "\n",
    "    # place labels at the top\n",
    "    plt.gca().xaxis.tick_top()\n",
    "    plt.gca().xaxis.set_label_position('top')\n",
    "\n",
    "    # plot the matrix per se\n",
    "    plt.imshow(matrix, interpolation='nearest', cmap=plt.cm.Blues)\n",
    "\n",
    "    # plot colorbar to the right\n",
    "    plt.colorbar()\n",
    "\n",
    "    fmt = 'd'\n",
    "\n",
    "    # write the number of predictions in each bucket\n",
    "    thresh = matrix.max() / 2.\n",
    "    for i, j in product(range(matrix.shape[0]), range(matrix.shape[1])):\n",
    "\n",
    "        # if background is dark, use a white number, and vice-versa\n",
    "        plt.text(j, i, format(matrix[i, j], fmt),\n",
    "             horizontalalignment=\"center\",\n",
    "             color=\"white\" if matrix[i, j] > thresh else \"black\")\n",
    "\n",
    "    tick_marks = np.arange(len(class_names))\n",
    "    plt.xticks(tick_marks, class_names, rotation=45)\n",
    "    plt.yticks(tick_marks, class_names)\n",
    "    plt.tight_layout()\n",
    "    plt.ylabel('True label',size=14)\n",
    "    plt.xlabel('Predicted label',size=14)\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "def predict(xgb_model, dataset, proba=False, threshold=0.5):\n",
    "    \"\"\"\n",
    "    Predicts labels given a xgboost model that outputs raw logits. \n",
    "    \"\"\"\n",
    "    \n",
    "    y_pred = model.predict(dataset)  # raw logits are predicted\n",
    "    y_pred_proba = invlogit(y_pred) \n",
    "    if proba:\n",
    "        return y_pred_proba\n",
    "    y_pred_class = np.zeros_like(y_pred)\n",
    "    y_pred_class[y_pred_proba >= threshold] = 1  # assign a label \n",
    "    \n",
    "    return y_pred_class\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train accuracy:  87.75  %.\n",
      "Test  accuracy:  86.6797%.\n"
     ]
    }
   ],
   "source": [
    "y_pred_train = predict(model, dtrain)\n",
    "y_pred_test = predict(model, dtest)\n",
    "\n",
    "plot_conf_matrix(y_test, y_pred_test, target_names)\n",
    "\n",
    "print(f'Train accuracy:  {round(100*accuracy_score(y_train, y_pred_train), 4)}  %.')\n",
    "print(f'Test  accuracy:  {round(100*accuracy_score(y_test, y_pred_test), 4)}%.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Footnotes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='Footnotes'></a>\n",
    "\n",
    "[(1)](#f_1): One can derive the stated formula by noting that the probability of the positive class is $p_i = 1/( 1 + \\exp^{-\\hat{y}_i})$ and taking its logarithm."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## References"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='References'></a>\n",
    "\n",
    "\n",
    "[[1]](#source_4) Hastie, T., Tibshirani, R. and Friedman, J., 2009. The elements of statistical learning: data mining, inference, and prediction, p. 310, Springer Science & Business Media.\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.14"
  },
  "nbsphinx": {
   "orphan": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
